package com.tyl.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Calendar;
import java.util.Map;

public class JwtUtil {
    //生成令牌时候用到的秘钥，这是一个密码，自己保存，不能丢失，丢失后，系统就不安全了。
    private static final String SING="HELLOWORLD";

    /**
     * 生成令牌的，在生成令牌的时候，在令牌里面可以存放一些基础数据
     * @param map 在令牌里面存放的数据，放的数据可以是多个，多个数据放入map
     * @return jwt令牌
     */
    public static String getToken(Map<String,String> map){
        JWTCreator.Builder builder= JWT.create();
        map.forEach((k,v)->{
            builder.withClaim(k,v);
        });
        Calendar instance = Calendar.getInstance();
        //设置token七天过期
        instance.add(Calendar.SECOND,70);

        String token = builder.withExpiresAt(instance.getTime())//指定过期时间
                .sign(Algorithm.HMAC256(SING));
        return token;
    }

    /**
     * 验证令牌是否有效，如果令牌验证失败，会抛出异常。所以我们应用的时候只要有异常抛出就验证失败，没有异常就验证通过。
     * @param token 要验证的令牌
     * @return 我们可以通过该返回值获取到令牌里面保存的基础数据。
     */
    public static DecodedJWT verify(String token){
        return JWT.require(Algorithm.HMAC256(SING)).build().verify(token);
    }
}
